package desperte.aqui;

import java.util.List;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.view.MotionEvent;
import android.widget.Toast;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;

public class Pinoverlay extends Overlay {

	//Variáveis de instância
	private long lastTimeTouch = -1;
	Drawable drawable;
	List<Overlay> mapOverlay;
	long releaseTime=0;
	long pressTime=0;
	
	@Override
	public void draw(Canvas canvas, MapView mapView, boolean shadow) {
		super.draw(canvas, mapView, shadow);
		
		//Recebe a projeção atual do mapa (whatever)
		Projection project = mapView.getProjection();
		
		//Recebe a latitude do mapa (da parte superior a inferior da MapView
		int latSpn = mapView.getLatitudeSpan();
		//Rece a longitude do mapa (da parte superior a inferior da MapView)
		int lngSpn = mapView.getLongitudeSpan();
		//Esse GeoPoint 'mapaCentro' recebe, como sugerido, o centro da MapView
		GeoPoint mapaCentro = mapView.getMapCenter();
		
		int mapaGeoLeft = mapaCentro.getLongitudeE6() - (lngSpn /2);
		int mapaGeoRight = mapaCentro.getLongitudeE6() + (lngSpn /2);
		int mapaGeoTop = mapaCentro.getLatitudeE6() - (latSpn /2);
		int mapaGeoBottom = mapaCentro.getLatitudeE6() + (latSpn /2);

		/*
		//O mapOverlay recebe os overlayers da mapView
		mapOverlay = mapView.getOverlays();
		//O desenho do 'map_pin' não funciona já que a classe não está no mesmo
		 *  contexto que o 'mapaconf'(da classe 'Cperfil')
		drawable = this.getResources().getDrawable(R.drawable.map_pin);
		//Adiciona a um InstantOverlay o drawable do map_pin (mas essa ação não
		 *  funciona por conta do problema de contexto)
		itemizedOverlay = new InstantOverlay(drawable);
		*/
		
		//Esse GeoPoint recebe uma posição passada por HardCode para o método
		//'getSampleLocation()'
		GeoPoint geoPoint = this.getSampleLocation();
		
		//Bloco que testa se a marcação do GeoPoint 'geoPoint' deve aparecer.
		//Esses testes, de maneira simplificada, dizem 'se estiver entre as 
		//coordenadas que estão disponíveis na tela,
		//desenhe o marcador (no caso, o 'markerblue')
		if ((geoPoint.getLatitudeE6() > mapaGeoTop 
				&& geoPoint.getLatitudeE6() < mapaGeoBottom)
				&& (geoPoint.getLongitudeE6() > mapaGeoLeft 
					&& geoPoint.getLongitudeE6() < mapaGeoRight)) {
				    //(?)
					Point myPoint = new Point();
					//Recebe a projeção atual do mapa(em pixels)
				    project.toPixels(geoPoint, myPoint);
				    //Cria o desenho do marcador 'markerblue'
				    Bitmap marker = BitmapFactory.decodeResource(
				    		mapView.getContext().getResources(), R.drawable.arrow_down);
				    //Posiciona o marcador sobre o mapa (a mapView)
				    canvas.drawBitmap(marker, myPoint.x - 15, myPoint.y - 30, null);
				}
	}

	//Substituir esse método por algo que receba a posição apontada no mapa
	
	private GeoPoint getSampleLocation() {
	    GeoPoint sampleGeoPoint =
	        new GeoPoint((int)(56.27058500725475 * 1E6),
	                     (int)(-2.6984095573425293 * 1E6));
	    return sampleGeoPoint;
	}
	

	/*TODO
	 * Reciclar analizador de gestos
	 * ~Provávelmente não será mais necessário se o overlay de detecção de gestos
	 * funcionar como deve
	 */
	@Override
	public boolean onTouchEvent(MotionEvent mevent, MapView mapView) {
		
				//Recebe a posição do click
				GeoPoint currentPoint = new GeoPoint((int)mevent.getX(), 
						(int)mevent.getY());
				//Teste do MotionEvent

				if(mevent.getAction() == MotionEvent.ACTION_DOWN){
					//'thisTime' recebe o milisegundo corrente através do sistema
					long thisTime = System.currentTimeMillis();		
					pressTime = System.currentTimeMillis();
					//caso o click atual subtraído do último click for menor que
					//250 milisegundos, reaja como 'duplo click'
					if(thisTime - lastTimeTouch < 250){
						//Ação de duplo click
						//Zoom para a região clicada
						mapView.getController().zoomInFixing((int)mevent.getX()
								, (int)mevent.getY());
						//Retorna a variável 'lastTimeTouch' para o valor inicial '-1'
						lastTimeTouch = -1;
					}
					else {
						//No caso de a condição acima não ser satisfeita
						lastTimeTouch = thisTime;
						
					}
				}
				else if(mevent.getAction() == MotionEvent.ACTION_UP){
					releaseTime = System.currentTimeMillis();
				}

				if(releaseTime - pressTime > 1000){
					//Criar método para gravação de arquivo e invocá-lo aqui.
					salvarLoc(currentPoint);
					Toast.makeText(mapView.getContext(), "Long click",
							Toast.LENGTH_LONG).show();
				}
			/*O método precisa ter um retorno*/
		return false;
	}
	

	/*Método que cria o arquivo que vai receber as coordenadas do mapa
	 * 
	 * @author Thassio Carvalho <tvmcarvalho@gmail.com>
	 */
	public boolean salvarLoc(GeoPoint gp){
	
		//CallDB cdb = new CallDB();
		
		return false;
	}
}